package com.yckj.dao;

import com.yckj.domain.User;
import com.yckj.util.DbUtilHikari;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import cn.hutool.crypto.SecureUtil;

/**
 * 对用户表的操作：注册用户、删除用户、查询用户、修改用户
 * @author 赵光华
 * @version 1.0
 */
public class UserDao {
    /**
     * 查询所有的用户
     * @return 包含用户对象的集合
     */
    public List<User> selectAllUser() {
        // 创建一个空集合，存放用户对象
        List<User> userList = new ArrayList<User>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        conn = DbUtilHikari.getConnection();
        String sql = "SELECT userid,username,userpsw FROM users";
        try {
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            // 把rs里的数据转移到userList集合里
            while (rs.next()) {
                User user = new User();
                user.setUserid(rs.getInt("userid"));
                user.setUsername(rs.getString("username"));
                user.setUserpsw(rs.getString("userpsw"));
                userList.add(user);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DbUtilHikari.close(rs, pstmt, conn);
        }

        return userList;
    }
    /**
     * 修改用户信息
     * @param userid 用户编号
     * @param uname 用户名
     * @param upsw 用户密码
     * @return 修改成功返回1，否则返回0
     */
    public int updateUser(int userid, String uname, String upsw) {
        int flag = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        conn = DbUtilHikari.getConnection();
        String sql = "UPDATE users SET username=?,userpsw=? WHERE userid=?";
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            pstmt.setInt(3,userid);
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DbUtilHikari.close(pstmt, conn);
        }
        return flag;
    }
    /**
     * 按用户编号删除用户
     * @param userid 用户编号
     * @return 删除成功返回1，否则返回0
     */
    public int deleteUser(int userid) {
        int flag = 0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        // 获取数据库连接
        conn = DbUtilHikari.getConnection();

        String sql = "DELETE FROM users WHERE userid=?";
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, userid);
            // 执行SQL语句
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 关闭资源
            DbUtilHikari.close(pstmt, conn);
        }

        return flag;
    }

    /**
     * 按用户名和密码登录
     * @param uname 用户名
     * @param upsw 密码
     * @return 如果登录成功，返回true， 否则返回false
     */
    public boolean login(String uname, String upsw) {
        // flag是登录成功与否的标志，如果是true表示登录成功
        boolean flag = false;
        // conn表示数据库连接
        Connection conn = null;
        // pstmt执行SQL语句
        PreparedStatement pstmt = null;
        // rs表示结果集，从数据库里查到的结果放在rs中
        ResultSet rs = null;

        // 获得数据库连接，从连接池获取
        conn = DbUtilHikari.getConnection();
        // 定义SQL语句
        String sql = "SELECT FROM USERS WHERE username=? AND userpsw=?";
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            // 执行语句
            rs = pstmt.executeQuery();
            // next()判断rs结果集里有没有数据，
            // 如果next()返回true，说明rs结果集里有数据
            // 如果next()返回false，说明rs结果集里没有数据
            if (rs.next()) {
                flag = true;
            } else {
                flag = false;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DbUtilHikari.close(rs, pstmt, conn);
        }

        return flag;
    }

    /**
     * 用户注册
     * @param uname 用户名
     * @param upsw 密码
     * @return 注册成功返回1，否则返回0
     */
    public int insertUser(String uname, String upsw) {
        //1.声明一些变量
        // conn代表数据库连接
        Connection conn = null;
        // 预编译对象，用pstmt执行SQL语句
        PreparedStatement pstmt = null;
        // 注册成功与否标志，如果为0，即注册失败，如果为1，则注册成功
        int flag = 0;

        // 2.获取连
        conn = DbUtilHikari.getConnection();
        // 3.定义并准备SQL语句
        String sql = "INSERT INTO users(username, userpsw) VALUES(?,?) ";
        try {
            pstmt = conn.prepareStatement(sql);
            // 4.给？赋值
            pstmt.setString(1, uname);
            pstmt.setString(2, SecureUtil.md5(upsw));
            // 5.执行SQL语句（下达执行指令）
            flag = pstmt.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            // 6.关闭数据库资源
            DbUtilHikari.close(pstmt, conn);
        }
        return flag;
    }

}
